
#include <pthread.h>    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include"mutex.hpp"

using namespace Mymutex;
Mutex lock;
int ticket=1000;  
class threaddata{
       public:
        threaddata(const std::string& name,Mutex& lock):
        _name(name),_lock(&lock)    
        {
            
        }
        ~threaddata()
        {
        }
    // private:
   std::string _name;
     Mutex *_lock;
};
void *thread_func(void *arg)
{
    threaddata *data=(threaddata*)arg;    
    while(1)
    {
        LockGuard lock(*data->_lock);
        if(ticket>0)
        {
            usleep(1000);
            std::cout<<data->_name<<" get ticket:"<<ticket<<std::endl;
            ticket--;
        }
        else
        {
            std::cout<<data->_name<<" no ticket,wait"<<std::endl;   
            break;
           
        }
    }
    return nullptr;
}
int main()
{
    pthread_t t1, t2, t3, t4;
    threaddata td1("thread 1", lock);
    pthread_create(&t1, NULL, thread_func, &td1);

    threaddata td2("thread 2", lock);            
    pthread_create(&t2, NULL, thread_func, &td2);

    threaddata td3("thread 3", lock);           
    pthread_create(&t3, NULL, thread_func, &td3);

    threaddata td4("thread 4", lock);
    pthread_create(&t4, NULL, thread_func, &td4);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);
    return 0;
}



// #include <pthread.h>
// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <iostream>
// #include <unistd.h>
// using namespace std;
// pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER; 
// int ticket=1000;  
// class mutexdata
// {
//      public:
//      mutexdata(const string& name,pthread_mutex_t& lock):
//      _name(name),_lock(&lock)    
//      {
        
//      }
//      ~mutexdata()
//      {
//      }
//     // private:
//     string _name;
//     pthread_mutex_t *_lock;
// };



// void *thread_func(void *arg)
// {
//     mutexdata *data=(mutexdata*)arg;
    
//     while(1)
//     {
//         //pthread_mutex_lock(data->_lock);
//         pthread_mutex_lock(&lock);
//         if(ticket>0)
//         {
//             usleep(1000);
//             cout<<data->_name<<" get ticket:"<<ticket<<endl;
//             ticket--;
//             pthread_mutex_unlock(&lock);
//         }
//         else
//         {
//             pthread_mutex_unlock(&lock);
//             cout<<data->_name<<" no ticket,wait"<<endl;
//             break;
           
//         }
//     }
//     return nullptr;
//     }
// int main()
// {
//        pthread_t t1, t2, t3, t4;
//     mutexdata *td1 = new mutexdata("thread 1", lock);
//     pthread_create(&t1, NULL, thread_func, td1);

//     mutexdata *td2 = new mutexdata("thread 2", lock);    
//     pthread_create(&t2, NULL, thread_func, td2);

//     mutexdata *td3 = new mutexdata("thread 3", lock);   
//     pthread_create(&t3, NULL, thread_func, td3);

//     mutexdata *td4 = new mutexdata("thread 4", lock);
//     pthread_create(&t4, NULL, thread_func, td4);

//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);
//     return 0;
// }